package com.cl.websocketboot.constant;

import com.cl.websocketboot.entity.Message;
import com.cl.websocketboot.entity.UserInfo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 用于数据的存储
 */
public class Constant {
    public static String SYSTEM_STR = "System";

    /**
     * key为房间号
     * value是房间内的所有的人
     */
    public static Map<String, Set<String>> usersInRoom = new ConcurrentHashMap<>();

    /**
     * 说明: 之所以定义该数据结构，是因为用户的退出的时候，无法在请求的头信息中获取到用户名和房间号。
     * key是通道的id
     * userInfo中包含了用户的房间号与用户名
     */
    public static Map<String, UserInfo> channelId2UserInfo = new ConcurrentHashMap<>();

    /**
     * key是房间号
     * value是房间内的所有的信息
     */
    public static Map<String, List<Message>> messagesOfRoom = new ConcurrentHashMap<>();

    public static long getUserNum() {
        return usersInRoom.values().stream().mapToLong(Set::size).sum();
    }

    public static String systemMessageJson(String roomId, String text) {
        return Message.systemMessageJson(roomId, text);
    }

    public static void saveMsg(String roomId, Message message) {
        // 取出对应房间的所有的聊天记录
        List<Message> messageList = Constant.messagesOfRoom.get(roomId);
        if (null == messageList) { //房间内的首次发信息
            messageList = new ArrayList<>(50);
            messageList.add(message);
            Constant.messagesOfRoom.put(roomId, messageList);
        } else {
            messageList.add(message);
        }
    }

}